@icon("res://scenes/stages/player_bag_and_info/art/bag.svg")
extends Resource
class_name ItemContainer
# 定义一个资源类，用来表示容纳某种物品的容器
# 基础容器(ItemContainer_Base)使用条目数限制容器大小，同时其包含的物品拥有顺序

@export var item_data_base:ItemDataBase = ItemDataBase.new() ## 包含物品信息的数据库，背包只保存有限信息
@export var items_in_container_stuck:Array## 此容器的主要内容，包含由字典组成的列表

@export_group("容器参数")
@export var check_slot_count:bool = true ## 勾选则限制容器格子数量
@export var max_slot_count:int = 12 ## 容器能容纳的最大格子数

@export var check_weight:bool = true ## 勾选则限制容器容纳重量
@export var max_weight:int = 100  ## 容器能容纳的最大重量
@export var DefaultStuckSize:int = 1 ## 默认的物品堆叠大小,除非数据库中的物品设置了"stuck_size"属性

@export var Texture_Address:String="res://data/item/assets/"#图片文件夹的地址 之后只需要将图片名 在加上文件夹地址就可以读取 图片了



@export_group("列表字典键")
@export var ItemId_Key:String = "id" ## 指定组成容器列表字典的键
@export var ItemAmount_Key:String = "amount"
@export var ItemStuckSize:String="stuck_size"
@export var item_icon_path_key:String = "icon"
@export var DefaultIconPath:String = "res://icon.svg"
@export var ItemKEY_Array=[]


var WeightNow:float=0
var CountNow:int = 0
	
func add_item(item_id:String) -> bool:
	var ItemInfoDic:Dictionary
	if can_add_item(item_id):
		for ItemIndex in item_data_base.item_dic[item_id]:
			ItemInfoDic[ItemIndex]=item_data_base.item_dic[item_id][ItemIndex]
		if item_data_base.item_dic[item_id][item_icon_path_key]=="":
			# 如果数据库未指定icon，则指定icon
			ItemInfoDic[item_icon_path_key] = DefaultIconPath
			
		## 找一个不为空的位置加进去
		var index = 0
		for item_info in items_in_container_stuck:
			if item_info == null:
				ItemInfoDic["index"] = index
				items_in_container_stuck[index] = ItemInfoDic
				break
			index += 1
	else: 
		print("装入"+str(item_id)+"失败, 数量:1")
		return false
		
	return true
func gay_class(ID:String):#相同ID的
	var ItemInfo_array:Array
	
	for ItemInfoIndex in range(len(items_in_container_stuck)):
		if not items_in_container_stuck[ItemInfoIndex].has("id"):
			continue
		if ID==items_in_container_stuck[ItemInfoIndex]["id"] and items_in_container_stuck[ItemInfoIndex]["stuck_size"] !=items_in_container_stuck[ItemInfoIndex]["amount"]:
			ItemInfo_array.append(ItemInfoIndex)
	if not ItemInfo_array.is_empty():
		return ItemInfo_array
	else:
		return false
		
func can_add_item(_item_id:String)->bool:
	if check_slot_count:
		CountNow = 0
		for item_info in items_in_container_stuck:
			if item_info != null:
				CountNow += 1
		if  CountNow >= max_slot_count:
			# 格子占满了
			print("bag full")
			return false
	return true

func remove_item(ItemId:String,Amount:int)->bool:
	# 将物品从容器中删除相应数量
	var idlist:Array = []
	for item_dic in items_in_container_stuck:
		idlist.append(item_dic[ItemId_Key])
	# 得到物品堆叠大小和包含所有id的列表
	if ItemId in idlist:
		# 开始删除过程
		var lastAmount:int = Amount #剩余需要删除的数量
		var _StuckSize:int = GetStuckSize(ItemId)
		for index in range(len(items_in_container_stuck)):
			if items_in_container_stuck[index][ItemId_Key] == ItemId:
				# 对于指定物品,减去相应数量
				if lastAmount < items_in_container_stuck[index][ItemAmount_Key]:
					items_in_container_stuck[index][ItemAmount_Key] -= lastAmount
					lastAmount = 0
				else:
					# 一个格子不够减,则寻找下一个符合条件的格子
					lastAmount -= items_in_container_stuck[index][ItemAmount_Key]
					items_in_container_stuck[index][ItemAmount_Key] = 0
		for index in range(len(items_in_container_stuck)-1,-1,-1):
			# 逆序遍历来删除
			if items_in_container_stuck[index][ItemAmount_Key]<=0:
				items_in_container_stuck.pop_at(index)
		# print("移除了"+str(Amount-lastAmount)+"个 "+str(ItemId))
		return true
	else:
		print("背包中没有指定物品"+str(ItemId)+",移除失败")
		return false


func save_as_resource(FilePath:String):
	# 将整个资源文件保存到path
	# 这里应该判断路径中的目录是否存在，不存在的话要新建目录
	ResourceSaver.save(self, FilePath)

func GetStock()->Array:
	print(items_in_container_stuck)
	return items_in_container_stuck

func GetStuckSize(_ItemId:String)->int:#返回
	var StuckSize:int = DefaultStuckSize
	return StuckSize
